#include<iostream>
#include<string>
#include<regex>

int main()
{
    //HTTP请求行格式:GET /wwwroot/index.html?username=wahaha&passwoed=123456 HTTP/1.1\r\n
    //std::string src = "get /wwwroot/index.html?username=wahaha&passwoed=123456 HTTP/1.1\r\n";
    //std::string src = "GET /wwwroot/index.html?username=wahaha&passwoed=123456 HTTP/1.1\r";
    //std::string src = "GET /wwwroot/index.html?username=wahaha&passwoed=123456 HTTP/1.1";
    //std::string src = "GET /wwwroot/index.html HTTP/1.1\r\n";
    
    std::string src = "GET / HTTP/1.1";

    std::smatch matches;

    //| 表示任意一个
    //[] 表示一个匹配规则
    //^? 表示除了(?)以外的所有字符
    //\\? 因为？有特殊正则意思，所以要加转义字符确定是个（?）字符，但是一个/为转义字符,因此//表示/为一个普通字符
    //.* .表示除了\r、\n以外的所有字符，*表示匹配0次或多次。
    //.+ 匹配除了\r、\n以外的所有字符1次或多次。
    //[01] 表示0或者1都行，等价于(?: 0|1)，但是[]里面只能存字符、()里面可以是字符串
    //(?:\r|\r\n)? 表示匹配0次或一次（\r或者\r\n其中一个字符但是不捕获），?:表示不捕获，?表示前面的匹配规则匹配0次或1次
    //(?:\\?(.*))? 这个也是同样的道理，以?开始的字符串匹配0次或多次，如果匹配上了而且不要这个匹配字符串，子要里面的.*

        std::regex e("(GET|POST|PUT|HEAD|SET|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\r|\r\n)?",std::regex::icase);

    bool ret = std::regex_match(src,matches,e);
    if(ret == false)
    {
        return -1;
    }

    for(auto s : matches)
    {
        std::cout << s << std::endl;
    }

    return 0;
}